/*Copyright (C) 2009 - 2011 MASSART GAUTHIER

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/

#include "../headers.h"

#define TAILLE_MAX 1000

void snake_jeu(void) {
	long continuer = 0;
	char *contenu_titre = "SNAKE";

	clear();
	afficher_titre(contenu_titre);
	get_player_name(0, prenom);


	while(continuer != 2) {
		char matrice[1000] = {'#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#',
													'#', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '#',
													'#', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '#',
													'#', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '#',
													'#', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '#',
													'#', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '#',
													'#', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '#',
													'#', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '#',
													'#', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '#',
													'#', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '#',
													'#', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '#',
													'#', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '#',
													'#', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '#',
													'#', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '#',
													'#', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '#',
													'#', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '#',
													'#', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '#',
													'#', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '#',
													'#', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '#',
													'#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#',
												 };
		char nom_niveau[50], nom_auteur[100], filename[300] = {0};
		int Quitter, Direction, Mouvement;
		long secu = 0, touche_appuyee = touche_droite, ToucheSauve = 0, choix = 0, choix2 = 0, tour = 0, PositionDuJoueur, i, j, k = 0, l = 0, m = 0, n = 0, longueur = 3, score = 0, passe = 0, passe2 = 0, coeur = 0, sortie = 0, vie = 3, vitesse = 170, save_vitesse = 170, ret[1000] = {0}, niveau = 0, nombre_niveau = 0;
		bool continuerSortie = false;
		Quitter = 1;
		PositionDuJoueur = 451;

		clear();
		choix2 = afficher_menu("*Avec obstacles\nNiveau 1 : serpent lent\nNiveau 2 : serpent vitesse normale\nNiveau 3 : serpent rapide\nPersonnaliser\n*Sans obstacle\nPersonaliser\n", "Selectionnez votre niveau:\n", contenu_titre);

		switch(choix2) {
		case 1 :
			vitesse = 300;
			strcpy(filename, SNAKE_LVLS_FILENAME);
			break;
		case 2 :
			vitesse = 200;
			strcpy(filename, SNAKE_LVLS_FILENAME);
			break;
		case 3 :
			vitesse = 100;
			strcpy(filename, SNAKE_LVLS_FILENAME);
			break;
		case 4 :
			clear();
			vitesse = snake_afficher_barre_vitesse(vitesse);
			clear();

			choose_pack("Snake", filename);

			if(fichier_existe(filename) == false) {
				if(filename[0] == 0) {
					strcpy(filename, SNAKE_LVLS_FILENAME);
				}
			}

			clear();
			break;
		case 5 :
			clear();
			vitesse = snake_afficher_barre_vitesse(vitesse);
			strcpy(nom_niveau, "SANS OBSTACLES");
			strcpy(filename, "SANS OBSTACLES");
			strcpy(nom_auteur, "AUCUN");
			clear();
		default :
			break;
		}

		clear();

		afficher_titre(contenu_titre);
		snake_afficher_info();
		nombre_niveau = snake_charger_niveau(niveau, filename, matrice, nom_niveau, nom_auteur);
		niveau++;

		while(vie != 0 && Quitter == 1) {
			snake_affichage_mat(matrice, nom_niveau, nom_auteur, vie, score, niveau, nombre_niveau);
			refresh();
			CSLP_Sleep(vitesse);

			if(CSLP_PollChar()) { // Test si une touche est préssé

				secu = getch();

				while(CSLP_PollChar()) { // Pour vider la pile de touche appuyées et ne prendre en compte que la dernière
					secu = getch();
				}

				if(PositionDuJoueur != 499) { // Test si le joueur n'est pas en cours de passage au niveau sup
					if(secu == touche_gauche || secu == touche_bas || secu == touche_droite || secu == touche_haut || secu == '0') {
						if((secu == touche_bas && touche_appuyee != touche_haut) || (secu == touche_haut && touche_appuyee != touche_bas) || (secu == touche_gauche && touche_appuyee != touche_droite) || (secu == touche_droite && touche_appuyee != touche_gauche)) {
							touche_appuyee = secu;
						}

						if(secu == '0') {
							ToucheSauve = touche_appuyee; // Sauve la dernière touche pour repartir après la pause
							touche_appuyee = secu;
						}
					}
				}
			}

			if(touche_appuyee != '0') {
				Direction = determiner_direction(touche_appuyee);
				i = PositionDuJoueur + Direction;
				j = PositionDuJoueur + Direction * 2;
				Mouvement = type_mvt_snake(matrice[i]);

				if(Mouvement != 0) {
					if(Mouvement == 1) {
						matrice[PositionDuJoueur] = '=';
						matrice[PositionDuJoueur + Direction] = '>';
						PositionDuJoueur = i;
					}

					if(Mouvement == 2) {
						jouer_son(MANGE);
						matrice[PositionDuJoueur + Direction] = '>';
						matrice[PositionDuJoueur] = '=';
						PositionDuJoueur = i;
						score += 250;
						longueur++;
					}

					if(Mouvement == 3) {
						jouer_son(MANGE);
						matrice[PositionDuJoueur + Direction] = '>';
						matrice[PositionDuJoueur] = '=';
						PositionDuJoueur = i;
						score += 500;

						if(vitesse > 100) {
							vitesse -= 50;
						}

						longueur++;
					}

					if(Mouvement == 4) {
						if(PositionDuJoueur != 499) {
							jouer_son(VIEPERDUE);
							vie--;
						}
					}

					if(Mouvement == 5) {
						jouer_son(MANGE);
						CSLP_Sleep(100);
						jouer_son(VIEGAGNEE);
						matrice[PositionDuJoueur + Direction] = '>';
						matrice[PositionDuJoueur] = '=';
						PositionDuJoueur = i;
						vie++;
						score += 1000;
					}
				}
			}
			else {
				clear();
				choix = afficher_menu("Oui\nNon\n", "Voulez-vous quitter la partie en cours ?\n", "____─'PAUSE'─____");
				CSLP_ColorText(CT);
				clear();

				if(choix == 1) {
					Quitter = 0;
				}
				else {
					touche_appuyee = ToucheSauve;
					clear();
					afficher_titre(contenu_titre);
					snake_afficher_info();
					refresh();
				}
			}

			if(matrice[m] != 'o' && matrice[m] != 'O') {
				passe++;
				passe2++;
			}

			if(passe == 6 && sortie == 1) {
				matrice[499] = ' ';
				mvaddstr(14, 85, " ← Niveau suivant accessible!");
				save_vitesse = vitesse;
			}

			if(PositionDuJoueur == 499) {
				continuerSortie = false;
				mvaddstr(14, 85, "                                  ");
				l = 0;

				if(vitesse > 25) {
					vitesse -= 5;
				}

				while(l < 900) {
					l++;

					if(matrice[l] == '=')
						continuerSortie = true;
				}

				if(continuerSortie == false) {

					clear();

					if(nombre_niveau == niveau) {
						Quitter = 0;
					}
					else {
						afficher_titre(contenu_titre);
						snake_afficher_info();
						snake_charger_niveau(niveau, filename, matrice, nom_niveau, nom_auteur);
						PositionDuJoueur = 451;
						matrice[499] = '#';
						sortie = 0;
						passe = 0;
						vitesse = save_vitesse;
						niveau++;
					}
				}
			}

			while(matrice[m] != 'o' && matrice[m] != 'O' && passe < 7) {
				if(passe < 6) {
					m = random(51, 948);

					if(matrice[m] == ' ') {
						matrice[m] = 'o';
					}
				}
				else if(passe == 6 && sortie == 1) {
					m = 499;
					matrice[m] = 'O';
				}
				else if(sortie != 1) {
					m = random(51, 948);

					if(matrice[m] == ' ') {
						matrice[m] = 'O';
					}

					passe = 0;

					if(choix2 != 5) {
						sortie++;
					}
				}
			}

			if(passe2 >= 5) {
				tour++;

				if(tour < 25 && coeur == 0) {

					l = random(1, 4);

					if(l == 1) {
						n = 51;
					}
					else if(l == 2) {
						n = 98;
					}
					else if(l == 3) {
						n = 901;
					}
					else if(l == 4) {
						n = 948;

					}

					matrice[n] = 'C';
					coeur = 1;

				}
				else if(matrice[n] != 'C') {
					coeur = 0;
					tour = 0;
					passe2 = 0;
				}
				else if(tour > 25) {
					matrice[n] = ' ';
					coeur = 0;
					tour = 0;
				}

			}

			while(k != 999) {
				if(matrice[k] == '=') {
					ret[k]++;

					if(ret[k] == longueur) {
						matrice[k] = ' ';
						ret[k] = 0;
					}

				}

				k++;
			}

			k = 0;

		}

		if(vitesse <= 100 && score >= 2000 && choix != 1) {
			CSLP_Sleep(200);
			bravo();
		}
		else if(choix != 1) {
			CSLP_Sleep(450);
			perdu();
		}

		afficher_titre(contenu_titre);
		snake_afficher_info();
		snake_affichage_mat(matrice, nom_niveau, nom_auteur, vie, score, niveau, nombre_niveau);
		move(30, 0);
		afficher_centre("FINI!");
		refresh();

		afficher_temps(32, 'm', 1, 2500);

		if(choix != 1) {
			clear();
			afficher_titre(contenu_titre);
			CSLP_ColorText(CT);
			save_score("Snake", score, vitesse, filename);
			lire_suppr_score("Snake", true);
			refresh();
			getch();
		}

		clear();

		continuer = afficher_menu_recommencer(contenu_titre);
		CSLP_ColorText(CT);
	}
}
